﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Net;
using System.Net.Sockets;
using System.IO;

namespace Model
{
    public class KlientHandler
    {

        //Variabler
        private Socket socket;
        private bool kører = true;
        NetworkStream networkstream;
        StreamReader reader;
        StreamWriter writer;
        Auktion auktion;

        //Konstruktør
        public KlientHandler(Socket socket, Auktion auktion)
        {

            this.socket = socket;
            networkstream = new NetworkStream(socket);
            reader = new StreamReader(networkstream);
            writer = new StreamWriter(networkstream);
            this.auktion = auktion;
            auktion.d_budhandler += WriteToSocket;
            Velkommen();
        }

        //Stop metode til at stoppe Start metoden
        public void Stop()
        {
            kører = false;
        }

        //Start metode, som skal køres i en tråd. Denne metode checker input fra klient siden
        //Noget af dette er ikke aktuelt lige pt da det blev lavet var det med bygning op imod flere auktioner
        //, hvilket vi endte ud med ikke at have. Klienten ville kun have en konsol UI, hvilket betød at der skulle skrives kommandoer
        //, i stedet for vores nuværende med et tal og et klik på bud knappen.
        //Dog er det stadig metoden der holder tråden kørende og splitter inputtet, så man kan checke på det første ord,
        //Samt det næste ord, da dette hovedsagligt ville være tallet. F.Eks. Bud 1000
        public void Start()
        {
            try
            {

                while (kører)
                {
                    string[] input = reader.ReadLine().Split(' ');

                    switch (input[0].ToUpper())
                    {
                        case "?":
                            {
                                writer.WriteLine("Command List");
                                writer.WriteLine("EXIT \t\t Terminates the connection");
                                writer.Flush();
                                break;
                            }

                        case "EXIT":
                            {
                                this.Stop();
                                writer.WriteLine("Stopper");
                                writer.Flush();
                                break;
                            }
                        case "BUD":
                            {
                                if (!auktion.Byd(socket.RemoteEndPoint.ToString(), int.Parse(input[1])))
                                {
                                    writer.WriteLine("Dit bud er for lavt! Det aktuelle bud er lige nu på: " + auktion.AktuelPris);
                                    writer.Flush();
                                }
                                break;
                            }
                        case "AUKTIONINFO":
                            {
                                writer.WriteLine("AuktionInfo" + "\r\nPris : " + auktion.AktuelPris + "\r\nNavn : " + auktion.Vare.Navn + "\r\nBeskrivelse : " + auktion.Vare.Beskrivelse + "\r\nVinder : "+ auktion.Ip);
                                writer.Flush();
                                break;
                            }
                        default:
                            {
                                writer.WriteLine("Ukendt kommando");
                                writer.Flush();
                                break;
                            }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Connection lost");
            }
            finally
            {
                auktion.d_budhandler -= WriteToSocket;
                if (writer != null) writer.Close();
                if (reader != null) reader.Close();
                if (networkstream != null) networkstream.Close();
                socket.Disconnect(true);
                //socket.Close();
            }
        }


        //Beskeden bliver sendt til Klienten ved hjælp af vores streamwriter og flushet.
        public void WriteToSocket(string besked, string ip, int bud)
        {
            writer.WriteLine(besked + " " + ip + " " + bud);
            writer.Flush();
        }

        public void Velkommen()
        {
            
            writer.WriteLine("velkommen til Auktionarius");
            writer.Flush();
        }
    }
}
